package com.practice.system.service.impl;

import com.practice.system.mapper.MaterielMapper;
import com.practice.system.mapper.ProductMapper;
import com.practice.system.mapper.PAndmMapper;
import com.practice.system.pojo.Product;
import com.practice.system.service.ProductService;
import com.practice.utils.PageUtils;
import com.practice.utils.Query;
import com.practice.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.*;

@Service
@Slf4j
public class ProductServiceImpl implements ProductService {
    @Autowired
    ProductMapper productMapper;
    @Autowired
    MaterielMapper materielMapper;
    @Autowired
    PAndmMapper pAndmMapper;

    /**
     * 查询条件以及列表显示
     * @param params
     * @return
     */
    @Override
    public R queryPage(Map<String, Object> params) {
        new Query().setStartPage(params);
        List<Product> list = productMapper.findProdectByPage(params);
        long count = productMapper.getDeviceCount(params);
        PageUtils<Product> page = new PageUtils<>(list,count);
        return R.ok().put("page",page);
    }

    /**
     * 新增+这里获取到到的是产品+物料的数据
     * 这里的逻辑为 一个产品1对应多个物料n
     * 所以传输的json应该为:
     * {
     *     Prodectjson...
     *     ...
     *     ...
     *     "materiels":[{materiel...},{materiel...},{materiel...}...]
     * }
     * @param params
     * @return
     */
    @Override
    public Boolean insertValue(Map<String, Object> params) {
        //定义标志位
        Boolean productFlag;
        Boolean MaterielFlag = false;
        Boolean pAndmFlag = false;
        //放入自己定义的uuid
        String ProductUUID = UUID.randomUUID().toString();
        params.put("id",ProductUUID);
        productFlag = productMapper.addValue(params);
        // 如果发送过来的json包含有已有的物料信息(materielListNeedInsert)，那么无需添加物料信息，只将其物料信息关联即可
        if(!ObjectUtils.isEmpty(params.get("materielListNeedInsert"))){
            List<String> materielList;
            materielList = (List<String>) params.get("materielListNeedInsert");
            for(String materielId:materielList){
                //这里取得他要项目需要绑定的物料值，写入关联表
                if(productFlag){
                    Map<String, Object> pAndmPojo = new HashMap<>();
                    pAndmPojo.put("productId",ProductUUID);
                    pAndmPojo.put("materielId",materielId);
                    log.info("写入产品id{},物料id{} 成功!",ProductUUID,materielId);
                    pAndmFlag = pAndmMapper.addValue(pAndmPojo);
                }
            }
        }
        // 产品所需的物料，这里批量写入materiel数据表
        // 如果发送过来的json包含有物料的信息(materiels)，那么自动新增物料信息，并且将其和项目关联
        if(!ObjectUtils.isEmpty(params.get("materiels"))){
            List<Map<String,Object>> materielList = new ArrayList<>();
            materielList = (List<Map<String,Object>>) params.get("materiels");
            for (Map<String, Object> materiel : materielList) {
                //放入随机id到物料表中
                String MaterielUUID = UUID.randomUUID().toString();
                materiel.put("id",MaterielUUID);
                if(productFlag){
                    MaterielFlag = materielMapper.addValue((Map<String, Object>) materiel);
                }
                else {
                    //这里插入产品表可能出现问题，出现问题就直接跳转回去
                    return false;
                }
                //放入关联表中
                Map<String, Object> pAndmPojo = new HashMap<>();
                pAndmPojo.put("productId",ProductUUID);
                pAndmPojo.put("materielId",MaterielUUID);
                log.info("写入产品id{},物料id{} 成功!",ProductUUID,MaterielUUID);
                pAndmFlag = pAndmMapper.addValue(pAndmPojo);
            }
        }else {
            log.info("产品id{}，未找到相关的物料，只插入产品",ProductUUID);
            return true;
        }
        if(productFlag || MaterielFlag || pAndmFlag){
            return true;
        }else{
            // TODO 这里如果表示插入失败，应该有对应的措施
            return false;
        }
    }

    /**
     * 修改
     * @param params
     * @return
     */
    @Override
    public Boolean updateValue(Map<String, Object> params) {
        //主要修改绑定的id，这里的逻辑是先删除产品表关联的物料id,然后在循环插入
        //删除关联表id
        pAndmMapper.deleteByProductId(params.get("id"));
        // 如果发送过来的json包含有已有的物料信息(materielListNeedInsert)，那么无需添加物料信息，只将其物料信息关联即可
        if(!ObjectUtils.isEmpty(params.get("materielListNeedInsert"))){
            List<String> materielList = (List<String>) params.get("materielListNeedInsert");
            for(String materielId:materielList){
                //这里取得他要项目需要绑定的物料值，写入关联表
                Map<String, Object> pAndmPojo = new HashMap<>();
                pAndmPojo.put("productId",params.get("id"));
                pAndmPojo.put("materielId",materielId);
                log.info("写入产品id{},物料id{} 成功!",params.get("id"),materielId);
                pAndmMapper.addValue(pAndmPojo);
            }
        }
        productMapper.updateValue(params);
        return true;
    }

    /**
     * 删除
     * @param id
     * @return
     */
    @Override
    public Boolean deleteValue(String id) {
        productMapper.deleteValue(id);
        return true;
    }
}
